package workflow;

import java.util.ArrayList;

import excepciones.ElSistemaEstaOcupadoException;
import excepciones.NoSeEncontroParticipanteException;

import alumno.AlumnoEnCarrera;

import Catedras.Catedra;
import docente.Docente;
import TemasPracticas.Trabajo_Practico;

public class Workflow
{
  Catedra catedra;
  ListaCircular<Generador> colaboradores = new ListaCircular<Generador>();
  Creador creador;
  TPEnGeneracion tp; //se crea con el constructor de workflow que recibe tambien una catedra por parametro.
  Rol rolActual;
  boolean ocupado;
  
   private void meetings(){
     creador.conocer(tp, colaboradores);
     colaboradores.crearIterador();
     for(int i=0; i<colaboradores.size();i++)
     {
       colaboradores.siguiente().conocer(tp);
     }
     tp.conocer(creador);
   }
   public Workflow(Catedra unaCatedra, Docente unDocente, ArrayList<AlumnoEnCarrera> alumnos){
    participantes(unDocente, alumnos);
    catedra = unaCatedra;
    tp = new TPEnGeneracion(this);
    meetings();
    rolActual = new RCreador(creador);
    setOcupado();
  }
  
  private void participantes(Docente unDocente, ArrayList<AlumnoEnCarrera> alumnos){
    creador = new Creador(unDocente,this);
    for(AlumnoEnCarrera e : alumnos)
    {
      colaboradores.agregar(new Generador(this,e));
    }
  }
  
  public boolean esColaborador(Generador colab, AlumnoEnCarrera alum){//probando
    return colab.getAlumno().getLegajo()==alum.getLegajo();
  }
  
  public Generador buscarColaborador(AlumnoEnCarrera alumno)throws NoSeEncontroParticipanteException{
    colaboradores.crearIterador();
    Generador encontrado = null;
    for(int i=0;i<colaboradores.size();i++)
    {
      Generador actual = colaboradores.siguiente();
      if(esColaborador(actual,alumno))//aca iba equals
      {
        encontrado=actual;
      }
    }
    if(encontrado == null)
    {
      throw new NoSeEncontroParticipanteException();
    }
    return encontrado;
  }
  
  public Rol getRolActual()
  {
    return rolActual;
  }
  public void setRolActual(Rol rolActual)
  {
    this.rolActual = rolActual;
  }
  public void logColaborador(AlumnoEnCarrera alumno) throws NoSeEncontroParticipanteException, ElSistemaEstaOcupadoException{
    if(!isOcupado())
    {
      Generador generador = buscarColaborador(alumno);
      if(esColaborador(generador,alumno))//aca iba equals
        {
          rolActual = new RGenerador(generador);
          setOcupado();
          }
      else
        {
        throw new NoSeEncontroParticipanteException();
        }
    }
    else
     {
      throw new ElSistemaEstaOcupadoException();
     }
   }
 
  
  public boolean esCreador(Creador cre, Docente doc){//probando
    return cre.getDocente().equals(doc);
  }
  
  public void logDocente(Docente docente) throws NoSeEncontroParticipanteException, ElSistemaEstaOcupadoException{
    if(!isOcupado())
    {
      if(esCreador(creador,docente))
        {
          rolActual = new RCreador(creador);
          setOcupado();
        }
      else
        {
          throw new NoSeEncontroParticipanteException();
        }
    }
    else
    {
      throw new ElSistemaEstaOcupadoException();
    }
  }
    
  public void crearTemas(ArrayList<String> titulos, Docente autor){
    rolActual.crearTemas(titulos,autor);
}
  
  public void enviarTemas(){
    rolActual.enviarTemas();
  }
  
  public ArrayList<Tema> obtenerTemas(){
    return rolActual.obtenerTemas();
  }

  //obtiene los parrafos del tema que corresponde al titulo
  public ArrayList<Parrafo> obtenerParrafos(String titulo){
    return rolActual.obtenerParrafos(titulo);
  }

  public ArrayList<Ejercicio> obtenerEjercicios(String titulo){
    return rolActual.obtenerEjercicios(titulo);
  }
  
  public void agregarParrafo(String titulo, String contenido){
    rolActual.agregarParrafo(titulo, contenido);
  }
  
  public void agregarEjercicio(String titulo, String contenido){
    rolActual.agregarEjercicio(titulo, contenido);
  }
  
  public void modificarParrafo(Parrafo unParrafo, String contenido){
    rolActual.modificarParrafo(unParrafo,contenido);
  }
  public void modificarEjercicio(Ejercicio unEjercicio, String contenido){
    rolActual.modificarEjercicio(unEjercicio,contenido);
  }
  
  public void comentarParrafo(Parrafo unParrafo, String comentario){
    rolActual.comentarParrafo(unParrafo, comentario);
  }
  
  public void comentarEjercicio(Ejercicio unEjercicio, String comentario){
    rolActual.comentarEjercicio(unEjercicio, comentario);
  }
  
  public void aprobar(String titulo){
    rolActual.aprobar(titulo);
}

  public void desaprobar(String titulo){
    rolActual.desaprobar(titulo);
}
  
  public ListaCircular<Generador> getColaboradores()
  {
    return colaboradores;
  }
  public void setColaboradores(ListaCircular<Generador> colaboradores)
  {
    this.colaboradores = colaboradores;
  }
  public Creador getCreador()
  {
    return creador;
  }
  public void setCreador(Creador creador)
  {
    this.creador = creador;
  }
  public TPEnGeneracion getTp()
  {
    return tp;
  }
  public void setTp(TPEnGeneracion tp)
  {
    this.tp = tp;
  }
  public Trabajo_Practico generarVersionFinal(int dia, int mes, int anio, String titulo){
    return rolActual.generarVersionFinal(dia,mes,anio,titulo);
  }
  public void enviarACatedra(Trabajo_Practico tp)
   {
   catedra.setTp(tp);
   }
  public boolean isOcupado()
  {
    return ocupado;
  }

  public void setOcupado()
  {
    this.ocupado = true;
  }
  
  public void liberar()
  {
    this.ocupado = false;
  }
  
}